from blog.auth import logincheck, logincheckjson
from flask import Blueprint, render_template, request, jsonify, session, flash, redirect, url_for
from blog.model.Article import Article
from datetime import datetime
from blog import db

#  创建蓝图 第一个参数为蓝图的名字
article = Blueprint('article', __name__)

'''
    下面两个师徒函数用到登录验证装饰器（@logincheck）,
    会报“AssertionError: View function mapping is overwriting an existing endpoint function: article.wrapper”错误，
    解决方法就是加endpoint='函数名'。
    原因如下（网络解释）：
    
    原来flask中url跟视图函数并不是直接对应的，而是有一个中间者-endpoint。

    三者之间的关系是这样的：
    
    ```
    url---->endpoint---->view_function
    ```
    
    它们是一对一的关系，在注册add_url_rule的时候，如果不指定endpoint，那么endpoint就会默认为函数名字，
    如果同一个endpoint于多个url注册的话，就会发生冲突，从而抛出异常。
'''


@article.route('/index', endpoint='index')
@logincheck
def index():
    # 根据用户id获取对应用户的文章，这里简单处理下，读取article所有文章
    article_list = Article.query.all()
    return render_template('article/index.html', list=article_list)


@article.route('/post', methods=['POST', 'GET'], endpoint='post')
@logincheck
def post():
    if request.method == 'GET':
        return render_template('article/post.html')
    if request.method == 'POST':
        # strip() 方法用于移除字符串头尾指定的字符（默认为空格）
        name = request.form['name'].strip()
        contents = request.form['contents'].strip()

        if name == '':
            return jsonify({'code': 'fail', 'msg': '请输入标题'})
        else:
            entity = Article()
            entity.name = name
            entity.contents = contents
            entity.type = 0
            entity.post_time = datetime.now()
            db.session.add(entity)
            db.session.commit()

            return jsonify({'code': 'succ', 'msg': '操作成功'})


@article.route('/edit/<int:id>', methods=['POST', 'GET'], endpoint='edit')
@logincheck
def edit(id):
    if request.method == 'GET':
        entity = Article.query.filter_by(id=id).first()
        return render_template('article/edit.html', article=entity)
    if request.method == 'POST':
        name = request.form['name'].strip()
        contents = request.form['contents'].strip()
        if name == '':
            return jsonify({'code': 'fail', 'msg': '请输入标题'})
        else:
            entity = Article.query.filter_by(id=id).first()
            if entity is None:
                return jsonify({'code': 'fail', 'msg': '博客不存在'})
            else:
                entity.name = name
                entity.contents = contents
                db.session.add(entity)
                db.session.commit()
                return jsonify({'code': 'succ', 'msg': '操作成功'})


@article.route('/delete', methods=['POST'], endpoint='delete')
@logincheckjson
def delete():
    articleId = request.form['id']
    entity = Article.query.filter_by(id=articleId).first()
    if entity is None:
        return jsonify({'code': 'fail', 'msg': '博客不存在'})
    else:
        db.session.delete(entity)
        db.session.commit()
        return jsonify({'code': 'succ', 'msg': '操作成功'})
